iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Software Development

Rust的多方面運用系列 第 4

[Day4] Rust 閉包以及判斷式

  • 分享至 

  • xImage
  •  

話就不多說了,直接開始今天的內容吧

閉包

閉包的別稱為「匿名函數」有三個特點

  • 可以像函數一樣被呼叫
  • 可以自動判斷傳入及傳回的類型
  • 可以捕捉環境中的自由變數
pub fn closure() {
    let closure_add = |i: i32, j: i32| -> i32{i + j};
    println!("{}", closure_add(1, 5));
}

以上就是最簡單的閉包,但是講的還沒有到很完整

let closure_add2 = | i, j | i + j;
println!("{}", closure_add2(7, 8));

如果要省略型式是可以這樣寫的
他會自動判斷傳入以及回傳形式。
不過,要注意的是

let closure_add2 = | i, j | i + j;
println!("{}", closure_add2(7, 8));
println!("{}", closure_add2(1.5, 5.1));

這樣是會編譯失敗的,因為在第一次使用時就決定了這個閉包的型式。
但是,這不就跟前面所寫的函數一樣嗎。
同樣是寫在函數中,也可以定義他的型別。

fn init_fn() {
    fn inside(i: i32, j: i32) -> i32 { i + j };
}

這樣是可以的,只是說最大的差別在,不能使用外部的變數。
也就是說閉包可以這樣寫。

pub fn closure() {
    let a = 1000;
    let closure_add1 = |i: i32, j: i32| -> i32{i + j + a};
    println!("{}", closure_add1(1, 5));
    let closure_add2 = | i, j | i + j + a as f64;
    //println!("{}", closure_add2(7, 8));
    println!("{}", closure_add2(1.5, 5.1));
}

而函數這樣寫則會報錯

pub fn init_fn() {
    let a = 5;
    fn inside(i: i32, j: i32) -> i32 { i + j + a };
    println!("{}", inside(5, 6));
}


以上大概就是簡單的閉包內容,閉包是以 trait 實現的,但是我也還沒介紹到 trait 所以就略過了。
絕對不是我懶的講


那接下來要講的就是判別式的部份。
在 Rust 中,能夠像 C / C++ 一樣使用 if / else
這邊就不放在 Github 上了。
因為應該蠻好理解的(我懶了 QQ)

let a = 5;
if a == 5 {
    println!("{}", a);
}
else if(a == 0) {
    println!("{}", a);
}
else {
    println!("NOT FIVE OR ZERO");
}

這邊的使用方法蠻簡單的
但是 if 判斷式其實還可以綁定在變數上。
像是這樣

let n = 5;
let a = if n > 5 {
    5
}
else {
    0
};
println!("{}", a);

如果說,這樣寫起來太過於醜陋,其實 Rust 有跟 C / C++ 中的 switch 差不多的 match
使用方式如下 :

let chk = 5;
match chk {
    0 => println!("IT ZERO"),
    5 => println!("IT FIVE"),
    _ => println!("OTHER"),
}

那在 Rust 中可以使用 @ 來將變數綁定給其他變數 ex:

let chk = 5;
match chk {
    0 => println!("IT ZERO"),
    n @ 5 => println!("{}", n),
    5 => println!("IT FIVE"),
    _ => println!("OTHER"),
}

也可以用 num...num 來構造範圍。
也可以用 num | num | num 來構造多選項比對。(講的有點複雜用 code)
那在 Rust 中可以使用 @ 來將變數綁定給其他變數 ex:

let chk = 5;
match chk {
    0 => println!("IT ZERO"),
    0..10 => println!("IT IN 0..10"),
    n @ 5 => println!("{}", n),
    5 | 3 | 1 => println!("IT FIVE OR 3 OR 1"),
    _ => println!("OTHER"),
}

那今天也寫了2000多字了
大概這樣 明天介紹啥我還在想 @@ 來個 loop 也不錯,順便幾道 Leetcode 吧!
有問題可以提問喔 owo/


9/9
我突然發現我少講一個點,就是當在使用判斷式
如: if else match 時,是不用像 C / C++ 一樣外面加一個括號的

if (a == 1){}

C++ 如果是這樣 Rust 就能直接省略

if a == 1 {}

總之 大概就這樣 半夜突然想到 QQ


上一篇
[Day3] Rust 函數 基本 / 進階 使用
下一篇
[Day5] 變數&&部份所有權&&簡單的迴圈
系列文
Rust的多方面運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言